//defineConfig提供了类型安全的功能，这意味着在编写配置时，IDE可以提供智能提示，帮助开发者避免常见的配置错误。
//loadEnv 允许开发者根据不同的开发或生产模式加载相应的环境变量。这些环境变量通常存储在.env文件中，用于配置应用程序在不同环境下的行为，如API地址、数据库连接信息、密钥等。
import { defineConfig, loadEnv, ConfigEnv, UserConfig } from "vite";
import { resolve } from "path";
import { wrapperEnv } from "./build/getEnv";
import { createProxy } from "./build/proxy";
import { createVitePlugins } from "./build/plugins";
import pkg from "./package.json";
import dayjs from "dayjs";

const { dependencies, devDependencies, name, version } = pkg;
const __APP_INFO__ = {
  pkg: { dependencies, devDependencies, name, version },
  lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss")
};

// @see: https://vitejs.dev/config/
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  const root = process.cwd();
  const env = loadEnv(mode, root);
  const viteEnv = wrapperEnv(env); //env默认值类型都是字符串，把端口号转换成数字，把“true”转成布尔等值

  return {
    base: viteEnv.VITE_PUBLIC_PATH, //"/"表示
    // 如果production写'/'，那么最终打包生成的index.html请求所有的静态资源路径都会以/开头=>>/favicon.ico  在拼上ip和端口,最终的请求地址=>192.168.1.111:8080/favicon.io
    // 如果production写'./'，那么最终打包生成的index.html请求所有的静态资源路径都会以/开头=>>./favicon.ico  './'等价于index.html的绝对路径=>192.168.1.111:8080/${包名}/favicon.ico  √
    // 如果production写'/myProject'，那么最终打包生成的index.html请求所有的静态资源路径都会以/myProject开头=>>/myProject/favicon.ico 在拼上ip和端口,=>192.168.1.111:8080/myProject/favicon.ico   这样就需要把包名改成myProject
    // 如果production写'myProject'，等同于'/myProject'
    root,
    resolve: {
      alias: {
        "@": resolve(__dirname, "./src"),
        "vue-i18n": "vue-i18n/dist/vue-i18n.cjs.js"
      }
    },
    define: {
      __APP_INFO__: JSON.stringify(__APP_INFO__)
      //这样可以配置全局变量，在运行时拿到编译时的数据
    },
    css: {
      // 此处配置css预处理器的东西
      preprocessorOptions: {
        scss: {
          additionalData: `@import "@/styles/var.scss";`
        }
      }
    },
    server: {
      //开发服务器选项
      host: "0.0.0.0", //npm run dev时可否外界访问，配置0.0.0.0 或者true的话或者vite --host，跑起来可用外界电脑访问， 默认是localhost
      port: viteEnv.VITE_PORT, //端口号
      open: viteEnv.VITE_OPEN, //跑起来时是否自动打开浏览器
      cors: true, //默认所有的IP所有的请求都能访问，如果想只有部分ip的电脑可以访问就可以配置这个
      // res.setHeader('Access-Control-Allow-Origin', '*');
      // res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
      // res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
      // Load proxy configuration from .env.development
      proxy: createProxy(viteEnv.VITE_PROXY) //配置另外一台中转服务器，用于解决请求时跨域的问题
      //    仅在开发环境有效，原理就是vite使用createProxyMiddleware生成一个虚拟的服务器，
      //    一般在axios的baseurl里加上'/api',这样配合使用
      //    虚拟的服务器反向代理了target的源服务器 ，这样消除了跨域问题
    },
    plugins: createVitePlugins(viteEnv),
    esbuild: {
      pure: viteEnv.VITE_DROP_CONSOLE ? ["console.log", "debugger"] : []
    },
    build: {
      outDir: "dist",
      minify: "esbuild",
      // esbuild 打包更快，但是不能去除 console.log，terser打包慢，但能去除 console.log
      // minify: "terser",
      // terserOptions: {
      // 	compress: {
      // 		drop_console: viteEnv.VITE_DROP_CONSOLE,
      // 		drop_debugger: true
      // 	}
      // },
      sourcemap: false,
      // 禁用 gzip 压缩大小报告，可略微减少打包时间
      reportCompressedSize: false,
      // 规定触发警告的 chunk 大小
      chunkSizeWarningLimit: 2000,
      rollupOptions: {
        output: {
          // Static resource classification and packaging
          chunkFileNames: "assets/js/[name]-[hash].js",
          entryFileNames: "assets/js/[name]-[hash].js",
          assetFileNames: "assets/[ext]/[name]-[hash].[ext]"
        }
      }
    }
  };
});
